package edu.nuc.ahm.juc.pool;

import java.util.concurrent.*;

/*
*
*
*  public ThreadPoolExecutor(int corePoolSize,  核心线程池大小
                              int maximumPoolSize, 最大核心线程池大小
                              long keepAliveTime,  超时了没有调用就会释放线程池
                              TimeUnit unit,   超时单位
                              BlockingQueue<Runnable> workQueue) {  // 阻塞队列
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler); // 线程工厂  ；  拒绝策略  new ThreadPoolExecutor.AbortPolicy() 默认拒绝策略 银行满了 还有人进来 不处理这个人的了 然后抛出异常
             *
             * new ThreadPoolExecutor.CallerRunsPolicy() 哪来的回哪去
             * new ThreadPoolExecutor.DiscardPolicy() 队列满了它不会抛出异常
             * ThreadPoolExecutor.DiscardOldestPolicy() 队列满了 尝试去和最早的竞争 也不会抛出异常  看看第一个人是不是快完了 或者刚完
* */
public class Demo2 {
    public static void main(String[] args) {
        ExecutorService threadPool = new ThreadPoolExecutor(2,5,3, TimeUnit.SECONDS,new LinkedBlockingQueue<>(3), Executors.defaultThreadFactory(),new ThreadPoolExecutor.DiscardOldestPolicy());
        try {
            // 最大承载 maximumPoolSize, 最大核心线程池大小+new LinkedBlockingQueue<>()阻塞队列
            for (int i = 1; i <=8; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"ok");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 线程池用完 程序结束 关闭线程池
            threadPool.shutdown();
        }
    }
}


